namespace NVelocity.Runtime.Directive
{
    /*
    * The Apache Software License, Version 1.1
    *
    * Copyright (c) 2000-2001 The Apache Software Foundation.  All rights
    * reserved.
    *
    * Redistribution and use in source and binary forms, with or without
    * modification, are permitted provided that the following conditions
    * are met:
    *
    * 1. Redistributions of source code must retain the above copyright
    *    notice, this list of conditions and the following disclaimer.
    *
    * 2. Redistributions in binary form must reproduce the above copyright
    *    notice, this list of conditions and the following disclaimer in
    *    the documentation and/or other materials provided with the
    *    distribution.
    *
    * 3. The end-user documentation included with the redistribution, if
    *    any, must include the following acknowlegement:
    *       "This product includes software developed by the
    *        Apache Software Foundation (http://www.apache.org/)."
    *    Alternately, this acknowlegement may appear in the software itself,
    *    if and wherever such third-party acknowlegements normally appear.
    *
    * 4. The names "The Jakarta Project", "Velocity", and "Apache Software
    *    Foundation" must not be used to endorse or promote products derived
    *    from this software without prior written permission. For written
    *    permission, please contact apache@apache.org.
    *
    * 5. Products derived from this software may not be called "Apache"
    *    nor may "Apache" appear in their names without prior written
    *    permission of the Apache Group.
    *
    * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
    * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
    * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
    * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
    * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
    * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
    * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
    * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
    * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    * SUCH DAMAGE.
    * ====================================================================
    *
    * This software consists of voluntary contributions made by many
    * individuals on behalf of the Apache Software Foundation.  For more
    * information on the Apache Software Foundation, please see
    * <http://www.apache.org/>.
    */
    using System;
    using MethodInvocationException = NVelocity.Exception.MethodInvocationException;
    using ParseErrorException = NVelocity.Exception.ParseErrorException;
    using ResourceNotFoundException = NVelocity.Exception.ResourceNotFoundException;
    using InternalContextAdapter = NVelocity.Context.InternalContextAdapter;
    using INode = NVelocity.Runtime.Parser.Node.INode;

    /// <summary> Base class for all directives used in Velocity.
    /// *
    /// </summary>
    /// <author> <a href="mailto:jvanzyl@apache.org">Jason van Zyl</a>
    /// </author>
    /// <version> $Id: Directive.cs,v 1.3 2003/10/27 13:54:10 corts Exp $
    ///
    /// </version>
    public abstract class Directive : DirectiveConstants  //,System.ICloneable
    {
	public abstract System.String Name{get
					   ;
					   set
					       ;
					      }
	    public abstract int Type{get
				     ;
				    }
	    public virtual int Line
	    {
		get {
		    return line;
		}

	}
	public virtual int Column
	{
	    get {
		return column;
	    }

	}
	private int line = 0;
	private int column = 0;

	protected internal RuntimeServices rsvc = null;

	/// <summary>Return the name of this directive
	/// </summary>

	/// <summary>Get the directive type BLOCK/LINE
	/// </summary>

	/// <summary>Allows the template location to be set
	/// </summary>
	public virtual void  setLocation(int line, int column) {
	    this.line = line;
	    this.column = column;
	}

	/// <summary>for log msg purposes
	/// </summary>

	/// <summary>for log msg purposes
	/// </summary>

	/// <summary> How this directive is to be initialized.
	/// </summary>
	public virtual void  init(RuntimeServices rs, InternalContextAdapter context, INode node) {
	    rsvc = rs;

	    //        int i, k = node.jjtGetNumChildren();

	    //for (i = 0; i < k; i++)
	    //    node.jjtGetChild(i).init(context, rs);
	}

	/// <summary> How this directive is to be rendered
	/// </summary>
	public abstract bool render(InternalContextAdapter context, System.IO.TextWriter writer, INode node);
    }
}
